package com.ruoyi.util.encrypt;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

/**
 * @Description: 使用AES进行加密解密 
 * @ClassName: AESUtils
 * @author syc
 * @date: 2022年9月19日 上午10:28:45
 */
public class AESUtils {

	public static final String algorithm = "AES";
	public static final String transformation = "AES/ECB/PKCS5Padding";
	
	/**
	 * @Description: 功能描述
	 * 		加密：对明文进行加密，返回密文信息
	 * 
	 * @param: 参数描述
	 * @param plaintext 明文信息
	 * @param password 	加密密码，此处使用AES-128-ECB加密模式，密码需要为16位
	 * @return  返回密文信息
	 * @throws: 异常描述
	 *
	 * @version: v1.0.3
	 * @author: wangwk
	 * @date: 2020年12月1日 下午7:41:47 
	 *
	 * Modification History:
	 * Date         Author          Version            Description
	 * ---------------------------------------------------------*
	 * 2020年12月1日   wangwk          v1.0.3.1               创建
	 */
	public static String encrypt(String plaintext, String password) {
		String ciphertext = null;
		try {
//			StringUtils.isNotBlank(plaintext, "明文信息不能为空");
//			StringUtils.isNotBlank(password, "密钥不能为空");
			/**
			 * 	密码处理
			 */
	        SecretKeySpec skeySpec = new SecretKeySpec(password.getBytes("UTF-8"), algorithm);
	        /**
	         * 	算法/模式/补码方式
	         */
	        Cipher cipher = Cipher.getInstance(transformation);
	        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
			/**
			 * 	明文加密为密文字节
			 */
	        byte[] encrypted = cipher.doFinal(plaintext.getBytes("UTF-8"));
	        /**
	         * 	此处使用BASE64做转码功能，同时能起到2次加密的作用，sun.misc.BASE64Encoder处理结果与Base64的一致
	         */
	        ciphertext = new Base64().encodeToString(encrypted);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return ciphertext;
    }
	
	/**
	 * @Description: 功能描述
	 * 		解密：对密文进行解密，返回明文信息
	 * 
	 * @param: 参数描述
	 * @param ciphertext 密文信息
	 * @param password 解密密码，此处使用AES-128-ECB加密模式，密码需要为16位
	 * @return 返回明文信息
	 * @throws: 异常描述
	 *
	 * @version: v1.0.3
	 * @author: wangwk
	 * @date: 2020年12月1日 下午7:45:41 
	 *
	 * Modification History:
	 * Date         Author          Version            Description
	 * ---------------------------------------------------------*
	 * 2020年12月1日   wangwk          v1.0.3.1               创建
	 */
	public static String decrypt(String ciphertext, String password) {
		String plaintext = null;
		try {
			// StringUtils.isNotBlank(ciphertext, "密文信息不能为空");
			// StringUtils.isNotBlank(password, "密钥不能为空");
			/**
			 * 	密码处理
			 */
            SecretKeySpec skeySpec = new SecretKeySpec(password.getBytes("UTF-8"), algorithm);
            /**
             * 	算法/模式/补码方式
             */
            Cipher cipher = Cipher.getInstance(transformation);
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            /**
             * 	先用base64解密
             */
            byte[] encrypted = new Base64().decode(ciphertext);
            /**
             * 	密文进行解密
             */
            byte[] original = cipher.doFinal(encrypted);
            /**
             * 	明文字节进行转换
             */
            plaintext = new String(original, "UTF-8"); 
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
		return plaintext;
    }
	
//	public static void main(String[] args) {
//		String plaintext = "张三是李四的好朋友";
//		String password = "165iweokjjnkjkkk";   // 秘钥需要是16位
//		String mw = encrypt(plaintext, password);
//		String jmh = decrypt(mw, password);
//		System.out.println(mw);
//		System.out.println(jmh);
//	}

}
